﻿using System;
using System.Linq;
using Quickie.Models;
using Quickie.Models.IoC;
using Quickie.Models.Data;
using Quickie.Models.Entities;
using Quickie.Models.ViewModel;
using Quickie.Models.Interfaces;

namespace Quickie.Models.Data
{
    /// <summary>
    /// Klasa koja predstavlja komunikaciju stvarnog objekta Category
    /// unutar aplikacije i tablice Category u bazi podataka.
    /// </summary>
    public class CategoryRepository : IRepository<Category>
    {
        private readonly IDataProvider data;

        /// <summary>
        /// Konstruktor klase
        /// </summary>
        /// <param name="data">Data provider</param>
        public CategoryRepository(IDataProvider data)
        {
            this.data = data;
        }

        /// <summary>
        /// Metoda koja pomoću LINQ upita vraća sve entite
        /// odnosno, kategorije.
        /// </summary>
        /// <returns></returns>
        public IQueryable<Category> GetAll()
        {
            return data.Linq<Category>();
        }

        /// <summary>
        /// Metoda koja vraća kategoriju s 
        /// odgovarajućim ID-om.
        /// </summary>
        /// <param name="ID">Jedinstvena oznaka kategorije</param>
        /// <returns></returns>
        public Category GetByID(int ID)
        {
            try
            { 
                return GetAll().Single(x => x.ID == ID);
            }
            catch (Exception)
            {
                return null;
            }
        }

        /// <summary>
        /// Metoda koja sprema postojecu/novu kategoriju u 
        /// bazu podataka
        /// </summary>
        /// <param name="category">Kategorija koju želite dodati</param>
        public void Save(Category item)
        {
            if (item.ParentID == 0) item.ParentID = null;
            data.Insert(item);
            data.SubmitChanges();
        }

        /// <summary>
        /// Metoda koja briše određenu kategoriju iz
        /// baze podataka
        /// </summary>
        /// <param name="category">Kategorija koju želite izbrisati</param>
        public void Delete(Category item)
        {
            data.Delete(item);
        }

        /// <summary>
        /// Metoda koja sprema sve promjene u bazu podataka
        /// a da su napravljene unutar web aplikacije.
        /// </summary>
        public void SaveChanges()
        {
            data.SubmitChanges();
        }
    }

}
